/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Maestros.DAO;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.AeropuertoSim;
import pe.edu.pucp.Modelo.Avion;
import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Continente;
import pe.edu.pucp.Modelo.EstadoAeropuerto;
import pe.edu.pucp.Modelo.Pais;
import pe.edu.pucp.Modelo.TipoAvion;
import pe.edu.pucp.Modelo.Vuelo;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.HibernateUtil;

/**
 *
 * @author katy
 */
public class AeropuertoDAO {
    
    public ArrayList<TipoAvion> listarTipoAviones() {
        ArrayList<TipoAvion> lstTipoAviones = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();

            List lista = session.createQuery("from TipoAvion").list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                TipoAvion a = (TipoAvion) iter.next();
                lstTipoAviones.add(a);
            }

            tx.commit();
        } catch (Exception e) { 
           if (tx != null) {
             tx.rollback();
             throw e;
           }
        }  finally { 
             session.close();
            return lstTipoAviones;
        }
    }
    
   
    public boolean guardarAeropuerto(Aeropuerto a)
    {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        boolean b = true;
        try {
            tx = session.beginTransaction();
        
            if (a.getIdaeropuerto() == 0) {
                String q = "select aeropuerto "
                        + "from Aeropuerto aeropuerto "
                        + "where aeropuerto.ciudad.idciudad = :idCiudadParam"; 
                Query query = session.createQuery(q);
                query.setParameter("idCiudadParam", a.getCiudad().getIdciudad());
                
                List lista = query.list();
                System.out.println("Tam aeropuertos:" + lista.size());
                if (lista.isEmpty() || lista.size()==0){
                   session.save(a);
                   System.out.println("id nuevo: " + a.getIdaeropuerto());
                }
                else 
                    b = false;
            }
            else { 
                session.update(a);
                b = true;
            }
            tx.commit();
        } catch (Exception e) {
             if (tx != null) {
             tx.rollback();
             throw e;
           }
        }finally { 
            session.close();
        }
        return b;
    }
    
    public ArrayList<EstadoAeropuerto> listarEstadosAeropuerto()
    {
        ArrayList<EstadoAeropuerto> listaEstadosAeropuerto = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try { 
            session.beginTransaction();

            List lista = session.createQuery("from EstadoAeropuerto").list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                EstadoAeropuerto a = (EstadoAeropuerto) iter.next();
                listaEstadosAeropuerto.add(a);
            }

            tx.commit();
        } catch (Exception e) {
             if (tx != null) {
             tx.rollback();
             throw e;
           }
        }
        finally {
            session.close();
            return listaEstadosAeropuerto;
        }
    }
    
    public ArrayList<Ciudad> listarCiudades()
    {
        ArrayList<Ciudad> listaCiudades = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
        tx = session.beginTransaction();
        
        List lista = session.createQuery("from Ciudad").list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Ciudad a = (Ciudad) iter.next();
            listaCiudades.add(a);
        }
        
        tx.commit();
        } catch (Exception e) {
             if (tx != null) {
             tx.rollback();
             throw e;
           }
        } finally {
            session.close();
            return listaCiudades;
        }
    }
    
    public ArrayList<Aeropuerto> listarAeropuertos(Date fechaRegistro, Ciudad ciudad, boolean filter)
    {   
        ArrayList<Aeropuerto> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        
        try {
            tx = session.beginTransaction();

            // Prepara cadena query
            String q = "select aeropuerto from Aeropuerto aeropuerto where aeropuerto.estadoAeropuerto.descripcion != 'INACTIVO' ";
            if(filter && fechaRegistro != null)
                q+= " AND aeropuerto.fechareg >= :fechaRegistroParam ";
            if(filter && ciudad != null)
                q+= " AND aeropuerto.ciudad.idciudad = :idCiudadParam ";
            q+= " order by aeropuerto.ciudad.descripcion asc ";

            // Crear query
            Query query = session.createQuery(q);
            if(filter && fechaRegistro != null)
                query.setParameter("fechaRegistroParam", fechaRegistro);
            if(filter && ciudad != null) 
                query.setParameter("idCiudadParam", ciudad.getIdciudad());

            // Ejecutar query
            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Aeropuerto a = (Aeropuerto) iter.next();
                Hibernate.initialize(a.getCiudad());
                Hibernate.initialize(a.getEstadoAeropuerto());
                Hibernate.initialize(a.getCiudad().getPais().getContinente());
                listaResultados.add(a);
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
                throw e;
           }
        } finally {
            session.close();

            return listaResultados;
        }
    }
    
    public Aeropuerto listarUnAeropuerto(int IdAeropuerto)
    {   
        Aeropuerto a=new Aeropuerto();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        
        try {
            tx = session.beginTransaction();

            // Prepara cadena query
            String q = "select aeropuerto from Aeropuerto aeropuerto where aeropuerto.estadoAeropuerto.descripcion != 'INACTIVO' and IdAeropuerto =:idAeropuertoParam";

            // Crear query
            Query query = session.createQuery(q);
                  query.setParameter("idAeropuertoParam", IdAeropuerto);
            
            // Ejecutar query
            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                a = (Aeropuerto) iter.next();
                Hibernate.initialize(a.getCiudad());
                Hibernate.initialize(a.getCiudad().getPais());
                Hibernate.initialize(a.getCiudad().getPais().getContinente());
                Hibernate.initialize(a.getEstadoAeropuerto());              
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
                throw e;
           }
        } finally {
            session.close();

            return a;
        }
    }
    
      public ArrayList<Continente> listarContinente(){
        ArrayList<Continente> listaContinente = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        String q = "select continente from Continente continente where idcontinente in (:ideu,:idam) order by idcontinente";
        Query query = session.createQuery(q);
        query.setParameter("ideu", Constante.CONTINENTE_EUROPA);
        query.setParameter("idam", Constante.CONTINENTE_SUDAMERICA);
        List lista = query.list();
        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Continente a = (Continente) iter.next();
            Hibernate.initialize(a.getPaises());
            listaContinente.add(a);
        }
        
        tx.commit();
        session.close();

        return listaContinente;
    }      
      
      public ArrayList<Pais> listarPais(int idcont){
        ArrayList<Pais> listaPais = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        Query query = session.createQuery("from Pais where idcontinente = :id");
        query.setInteger("id", idcont);
        List lista = query.list();
        Iterator iter = lista.iterator();        
        while (iter.hasNext()) {    
            Pais a = (Pais) iter.next();
            Hibernate.initialize(a.getContinente());
            Hibernate.initialize(a.getCiudads());
            Hibernate.initialize(a.getContinente().getPaises());
            listaPais.add(a);
        }
        
        tx.commit();
        session.close();

        return listaPais;
    }       
    
    public ArrayList<Ciudad> listarCiudad(int idpa){
        ArrayList<Ciudad> listaCiudad = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        Query query = session.createQuery("from Ciudad where idpais = :id");        
        query.setInteger("id", idpa);
        List lista = query.list();        
        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Ciudad a = (Ciudad) iter.next();
            Hibernate.initialize(a.getPais());
            Hibernate.initialize(a.getPais().getContinente());
            Hibernate.initialize(a.getPais().getCiudads());
            listaCiudad.add(a);
        }
        
        tx.commit();
        session.close();

        return listaCiudad;
    }    
    
        public ArrayList<Vuelo> getVuelosPorAeropuerto( Aeropuerto a) {
        ArrayList<Vuelo> lst = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            String q = "Select vuelo from Vuelo vuelo where vuelo.aeropuertoByIdorigen.ciudad.idciudad= :ciudadOrigen";
            Query query = session.createQuery(q);
            query.setParameter("ciudadOrigen", a.getCiudad().getIdciudad());

            List lista = query.list();
            System.out.println("Total de vuelos: " + lista.size());
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Vuelo v = (Vuelo) iter.next();
                Hibernate.initialize(v.getAeropuertoByIdorigen());
                Hibernate.initialize(v.getAeropuertoByIddestino());
                Hibernate.initialize(v.getAeropuertoByIdorigen().getCiudad());
                Hibernate.initialize(v.getAeropuertoByIddestino().getCiudad());
                
                lst.add(v);
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }
        } finally {
            session.close();
        }
        return lst;
    }
    
    public ArrayList<Avion> listaAvionesXAeropuerto(Aeropuerto avion) {
        ArrayList<Avion> lstAviones = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();

            Query query = session.createQuery("from Aeropuerto where idaeropuerto = :id ");
            query.setParameter("id", String.valueOf(avion.getIdaeropuerto()));

            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Avion a = (Avion) iter.next();
                lstAviones.add(a);
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }
        } finally {
            session.close();
        }
        return lstAviones;
    }
    
    public ArrayList<Aeropuerto> listaAeropuertoByContinente(int continente) {
        ArrayList<Aeropuerto> lstAeropuertos = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null; 
        try {
            tx = session.beginTransaction();

            Query query = session.createQuery("select aeropuerto from Aeropuerto aeropuerto,"
                     + " Ciudad ciudad, Continente continente, Pais pais where "
                     + " continente.idcontinente = pais.continente.idcontinente"
                     + " and pais.idpais=ciudad.pais.idpais"
                     + " and aeropuerto.ciudad.idciudad = ciudad.idciudad"
                     + " and continente.idcontinente = :idContinente");
            query.setParameter("idContinente", continente);

            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Aeropuerto a = (Aeropuerto) iter.next();
                Hibernate.initialize(a.getEstadoAeropuerto());
                Hibernate.initialize(a.getCiudad());
                Hibernate.initialize(a.getCiudad().getCordx());
                Hibernate.initialize(a.getCiudad().getCordy());
                a.setEstadoAeropuerto(a.getEstadoAeropuerto());
                lstAeropuertos.add(a);
            } 
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }    
        } finally {
            session.close();
        }
        return lstAeropuertos;
    }
    
    public void updateAlmacenes()
    {
        ArrayList<Ciudad> listaCiudad = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        Query query = session.createQuery("select inventario from Inventario inventario, Envio envio where ");              List lista = query.list();
    }

    public ArrayList<Aeropuerto> listarAeropuertos(int continente, int pais, int ciudad, Date fechaRegistro) {
        ArrayList<Aeropuerto> result = new ArrayList<>();
         
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null; 
        try {
            tx = session.beginTransaction();

            String q = " select aeropuerto from Aeropuerto aeropuerto where aeropuerto.estadoAeropuerto.descripcion ='ACTIVO' ";
            if (ciudad > 0) 
                q += " AND aeropuerto.ciudad.idciudad = :ciudadParam ";
            else 
                if (pais > 0)
                   q += " AND aeropuerto.ciudad.pais.idpais = :paisParam";
                else 
                    if (continente > 0) 
                        q+= "  AND aeropuerto.ciudad.pais.continente.idcontinente = :continenteParam ";
            if( fechaRegistro != null) 
                q+= " AND aeropuerto.fechareg >= :fechaParam ";
            
            System.out.println("query:" + q);
            
            Query query = session.createQuery(q);
            if(ciudad>0) 
                query.setParameter("ciudadParam", ciudad);
            else 
                if (pais>0)
                    query.setParameter ("paisParam",pais);
                else 
                    if(continente>0)
                        query.setParameter("continenteParam", continente);
            if(fechaRegistro != null)
                query.setParameter("fechaParam", fechaRegistro);
            
            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Aeropuerto a = (Aeropuerto) iter.next();
                Hibernate.initialize(a.getEstadoAeropuerto());
                Hibernate.initialize(a.getCiudad());
                Hibernate.initialize(a.getCiudad().getCordx());
                Hibernate.initialize(a.getCiudad().getCordy());
                Hibernate.initialize(a.getCiudad().getPais());
                Hibernate.initialize(a.getCiudad().getPais().getContinente());
                a.setEstadoAeropuerto(a.getEstadoAeropuerto());
                result.add(a);
            } 
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }    
        } finally {
            session.close();
        }
        return result;
    }
    
    public ArrayList<AeropuertoSim> listarAeropuertosSim(Date fechaRegistro, Ciudad ciudad, boolean filter)
    {   
        ArrayList<AeropuertoSim> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        
        try {
            tx = session.beginTransaction();

            // Prepara cadena query
            String q = "select aeropuerto from AeropuertoSim aeropuerto where aeropuerto.estadoAeropuerto.descripcion != 'INACTIVO' ";
            if(filter && fechaRegistro != null)
                q+= " AND aeropuerto.fechareg >= :fechaRegistroParam ";
            if(filter && ciudad != null)
                q+= " AND aeropuerto.ciudad.idciudad = :idCiudadParam ";
            q+= " order by aeropuerto.ciudad.descripcion asc ";

            // Crear query
            Query query = session.createQuery(q);
            if(filter && fechaRegistro != null)
                query.setParameter("fechaRegistroParam", fechaRegistro);
            if(filter && ciudad != null) 
                query.setParameter("idCiudadParam", ciudad.getIdciudad());

            // Ejecutar query
            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                AeropuertoSim a = (AeropuertoSim) iter.next();
                Hibernate.initialize(a.getCiudad());
                Hibernate.initialize(a.getEstadoAeropuerto());
                Hibernate.initialize(a.getCiudad().getPais().getContinente());
                listaResultados.add(a);
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
                throw e;
           }
        } finally {
            session.close();

            return listaResultados;
        }
    }
}

